SSH 服务器
Table of Contents
1. 启停
SSH 是 C/S 架构的软件。OpenSSH 的客户端软件是 ssh,服务器软件是 sshd。本文介绍 sshd。
如果没有安装 sshd,可以 sudo apt install openssh-server
直接安装。
一般来说,sshd 安装后会跟着系统一起启动。如果没启动 可以直接 sudo systemctl start sshd
启动, sudo systemctl enable sshd
使之可以自启动。
2. sshd 的配置文件
sshd 的配置文件为 /etc/sshsshd_config,同目录下也有一些安装时自动生成的密钥。
注意,如果重装 sshd 时 /etc/ssh 目录下的密钥都会重新生成,导致客户端重新 ssh 连接服务器时,会跳出警告,拒绝连接。可以在重装 sshd 前备份 /etc/ssh 目录,重装后用旧备份覆盖新配置。
配置文件 sshd_config 中:
- 每个命令占据一行。
- 每行都是配置项和对应的值。
- 配置项的大小写不敏感。
- 与值之间使用空格分隔。
比如:
# 指定 ssh-server 的监听端口为 2034 # 即 ssh 客户端可以通过服务器的 2034 端口连接到 sshd 进程 Port 2034 # 另一种格式,配置项与值之间有一个等号,等号前后的空格可选 Port = 2034
配置文件中 #
开头的行表示注释。空行等同于注释。 注释只能放在一行的开头,不能放在一行的结尾。
sshd 启动时自动读取 /etc/ssh/sshd_config 配置文件 ( 默认 )。如果希望使用其他的配置文件,可以用 -f
参数 sshd -f </path/to/my_config>
指定。
修改配置文件以后,可以用 sshd -t
检查有没有语法错误。
配置文件修改以后,并不会自动生效,必须重新启动 sshd。
3. sshd 密钥
sshd 有自己的一对或多对密钥。它使用密钥向客户端证明自己的身份。
所有密钥都是公钥和私钥成对出现,公钥的文件名一般是私钥文件名加上后缀 .pub
。
如果需要支持 SSH 1 协议,则必须有密钥 /etc/ssh/ssh_host_key。
如果密钥不是默认文件,那么可以通过配置文件 sshd_config 的 HostKey
配置项指定。默认密钥的设置如下:
# HostKey for protocol version 1 # HostKey /etc/ssh/ssh_host_key # HostKeys for protocol version 2 # HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_dsa_ke
上面命令前面的 # 表示这些行都是注释,因为这是默认值,有没有这几行都一样。
如果要修改密钥,就要去掉行首的 #,指定其他密钥。
HostKey /usr/local/ssh/my_dsa_key HostKey /usr/local/ssh/my_rsa_key HostKey /usr/local/ssh/my_old_ssh1_key
4. sshd 配置项
以下是 /etc/ssh/sshd_config 文件里面的常用配置项:
AcceptEnv [<env-1> [<env-2> ...]]
允许客户端通过SendEnv
命令传输来的环境变量列表,变量名之间使用空格分隔。AllowGroups [<group-a> [<group-b> ...]]
允许登录的用户组,多个组之间用空格分隔。为空则允许所有用户组登录。DenyGroups [<group-a> [<group-b> ...]]
不允许登录的用户组。用法同上。AllowUsers [<user-1> [<user-2> ...]]
允许登录的用户,用空格分隔用户名。可使用多行 AllowUsers 来指定多个用户。用户名支持使用通配符。为空则允许所有用户登录。该项也可以使用<user_name>@<host>
的格式。DenyUsers [<user-1> [<user-2> ...]]
不允许登录的用户。用法同上。AllowTcpForwarding [yes | local | remote]
是否允许端口转发,默认为 yes , local 表示只允许本地端口转发, remote 表示只允许远程端口转发。AuthorizedKeysFile </path/to/authorized_keys_file>
用户公钥存储路径,默认是 ~/.ssh/authorized_keys 目录。Banner </path/to/text-file>
用户登录后,sshd 向其展示的信息文件。默认为空,即不展示任何内容。ChallengeResponseAuthentication [yes | no]
是否使用键盘交互身份验证方案,默认值为 yes 。理论上讲,键盘交互身份验证方案可以向用户询问多重问题,但是实践中,通常仅询问用户密码。如果要完全禁用基于密码的身份验证,将PasswordAuthentication
和ChallengeResponseAuthentication
都设置为 no 。Ciphers {Ciphers | 3des-cbc | Ciphers,3des-cbc}
sshd 可以接受的加密算法 Ciphers 或 3des-cbc ,多个算法之间使用逗号分隔。ClientAliveCountMax <number>
建立连接后,客户端失去响应时,服务器尝试连接的次数。ClientAliveInterval <seconds>
允许客户端发呆的时间,单位为秒。如果这段时间里面,客户端没有发送任何信号,SSH 连接关闭。Compression [yes | no]
客户端与服务器之间的数据传输是否压缩。默认 yes 。HostKey
sshd 服务器的密钥。ListenAddress <ip>
sshd 监听的本机 IP 地址,即 sshd 启用的 IP 地址,默认是ListenAddress 0.0.0.0
表示在本机所有网络接口启用。可以改成只在某个网络接口启用 ( 比如ListenAddress 192.168.10.23
),也可以指定某个域名启用 ( 比如ListenAddress server.example.com
)。监听多个的 IP 地址,可以使用多行ListenAddress
命令。LoginGraceTime <seconds>
允许客户端登录时等待的最长时间,比如用户迟迟不输入密码,连接就会自动断开,单位为秒。值0
表示没有限制。LogLevel <log-level>
日志的详细程度,可能的值依次为QUIET
,FATAL
,ERROR
,INFO
,VERBOSE
,DEBUG
,DEBUG1
,DEBUG2
,DEBUG3
。默认为LogLevel INFO
。MACs
sshd 可以接受的数据校验算法,多个算法之间使用逗号分隔。MaxAuthTries <number>
允许 SSH 登录的最大尝试次数,如果密码输入错误达到指定次数,SSH 连接将关闭。MaxStartups <number>
允许同时并发的 SSH 连接数量,无默认值。值0
表示没有限制。也可以设为A:B:C
的形式,比如MaxStartups 10:50:20
意为如果达到 10 个并发连接,后面的连接将有 50% 的概率被拒绝;如果达到 20 个并发连接,则后面的连接将 100% 被拒绝。PasswordAuthentication [yes | no]
是否允许密码登录,默认为 yes 。建议改成 no 禁止密码登录,只允许密钥登录。PermitEmptyPasswords [yes | no]
是否允许空密码登录,即用户的密码是否可以为空,默认 yes ,建议改成 no 禁止无密码登录。PermitRootLogin [yes | no]
是否允许 root 用户登录,默认为 yes 。建议改成 no 禁止 root 用户登录。还有一种写法是写成PermitRootLogin prohibit-password
表示 root 用户不能用密码登录,但是可以用密钥登录。PermitUserEnvironment [yes | no]
是否允许 sshd 加载客户端的 ~/.ssh/environment 文件和 ~/.ssh/authorized_keys 文件里面的environment=<options>
环境变量设置。默认值 no 。Port <port>
sshd 监听的端口,即客户端连接的端口,默认 22 。出于安全考虑,可以改掉这个端口。配置文件可以使用多行Port
命令来同时监听多个端口。PrintMotd [yes | no]
用户登录后,是否向其展示系统的 motd ( Message of the the day ) 信息文件 etc/motd。该文件用于通知所有用户一些重要事项,比如系统维护时间、安全问题等。默认值 /yes 由于 Shell 一般会展示这个信息文件,所以可改为 *no*。PrintLastLog [yes | no]
是否打印上一次用户登录时间,默认值 yes 。Protocol {1 | 2 | 1,2}
sshd 使用的协议。Protocol 1
表示使用 SSH v1 协议,建议改成Protocol 2
。Protocol 2,1
表示同时支持两个版本的协议。PubKeyAuthentication [yes | no]
是否允许公钥登录,默认值 yes 。QuietMode [yes | no]
SSH v1 版本专用,日志只输出致命的错误信息,默认为 yes 。KeyRegenerationInterval <seconds>
SSH 1 版本的密钥重新生成时间间隔,单位为秒,默认是 3600 。RSAAuthentication [yes | no]
允许 RSA 认证,默认为 yes 。ServerKeyBits <number>
SSH v1 版本的密钥重新生成时的位数,默认为 768 。StrictModes [yes | no]
sshd 是否检查用户的一些重要文件和目录的权限。默认为 yes 。对于用户的 SSH 配置文件、密钥文件和所在目录,SSH 要求拥有者必须是根用户或用户本人,用户组和其他人的写权限必须关闭。SyslogFacility
Syslog 如何处理 sshd 的日志,默认SyslogFacility AUTH
。TCPKeepAlive [yes | no]
打开 sshd 跟客户端 TCP 连接的 keepalive 参数,默认为 yes 。UseDNS [yes | no]
用户 SSH 登录一个域名时,服务器是否使用 DNS,确认该域名对应的 IP 地址包含本机,默认为 yes 。打开该选项意义不大,而且如果 DNS 更新不及时,还有可能误判,建议关闭。UseLogin [yes | no]
用户认证内部是否使用/usr/bin/login
替代 SSH 工具,默认 no 。UserPrivilegeSeparation [yes | no]
用户认证通过以后,使用另一个子线程处理用户权限相关的操作,这样有利于提高安全性。默认为 yes 。VerboseMode [yes | no]
SSH v2 版本专用,日志输出详细的 Debug 信息,默认为 yes 。X11Forwarding [yes | no]
是否打开 X window 的转发,默认为 no 。
修改配置文件以后,用 sshd -t
验证配置文件是否有语法错误。新配置在重启 sshd 后生效。
5. sshd 的命令行配置项
sshd 命令有一些配置项。这些配置项在调用时指定,可以覆盖配置文件的设置。
-d
显示 debug 信息。-D
sshd 不作为后台守护进程运行。-e
将 sshd 写入系统日志 syslog 的内容导向标准错误 standard error 。-f
指定配置文件的位置。-h
指定私钥sshd -h </path/to/private_key>
。-o
指定配置文件的一个配置项和对应的值:sshd -o "<key> <value>"
,sshd -o "<key> = <value>"
或者sshd -o key=value
。-o
参数可以一次使用多个来指定多个配置。-p
指定 sshd 的服务端口。可以指定多个端口: `sshd -p <port-a> [-p <port-b> ...]= 。-t
检查配置文件的语法是否正确。